package co.edu.usbcali.egrapico.logica;

/**
 * Clase para la traducci�n de la representaci�n de una
 * <Code>Implicaci�n</Code> desde <I>GraPiCO Textual</I> hacia <I>C�lculo
 * PiCO</I>. <P> Recibe en <I>GraPiCO Textual</I> alguna de las siguientes
 * opciones:<P> <Blockquote><Pre>
 *                   < Antecedente;Consecuente>
 *                   < Antecedente;>
 * </Pre></Blockquote> <P> Traducci�n a <I>C�lculo PiCO</I> seg�n sea el
 * caso:<P> <Blockquote><Pre>
 *                   Antecedente then Consecuente
 *                   Antecedente then O
 * </Pre></Blockquote>
 *
 * @author Johanna Noguera Le�n & Alejandro Berm�dez Mart�nez.
 * @version 1.0
 * @since Enero de 2005
 */
public class Implication {

    //Variable para almacenar la implicaci�n representada en c�lculo PiCO.
    String implicationPico = "";
    //Variables para alamcenar el antecedente y el consecuente en GraPiCO Textual.
    String antecedentGraPicoT = "", consecuentGraPicoT = "";
    //Objeto de la clase Antecedent para traducir un antecedente.
    Antecedent antecedent;
    //Objeto de la clase Program, un consecuente es un programa.
    Program consecuent;
    // Nombre o lista de nombres de los procesos que se est�n traduciendo.
    String nameCurrentProcess = "";

    /**
     * M�todo constructor de la clase
     * <Code>Implication</Code>.<P> Separa el
     * <Code>Antecedente</Code> del
     * <Code>Consecuente</Code> usando el s�mbolo de sincronizaci�n ";".
     *
     * @param implicationGraPicoT Expresi�n equivalente a la representaci�n de
     * una
     * <Code>Implicaci�n</Code> en <I>GraPiCO Textual</I>.
     * @param nameProcess Nombre o lista de nombres de procesos.
     *
     */
    public Implication(String implicationGraPicoT, String nameProcess) {

        nameCurrentProcess = nameProcess;
        antecedentGraPicoT = implicationGraPicoT.substring(1, implicationGraPicoT.indexOf(";"));
        consecuentGraPicoT = implicationGraPicoT.substring(antecedentGraPicoT.length() + 2, implicationGraPicoT.length() - 1);
    }

    /**
     * Metodo generador de la traducci�n de una
     * <Code>Implicaci�n</Code>.<P> Obtiene la traducci�n del
     * <Code>Antecedente</Code> y del
     * <Code>Consecuente</Code> en <I>C�lculo PiCO<I> y los concatena
     * interponiendo
     * <Code>"then"
     * <Code>.
     *
     * @return        la
     * <Code>Implicaci�n</Code> traducida a <I>C�lculo PiCO<I>.
     */
    public String traslate() {

        antecedent = new Antecedent(antecedentGraPicoT, nameCurrentProcess);
        consecuent = new Program(consecuentGraPicoT, nameCurrentProcess);
        implicationPico = antecedent.traslate() + " then " + consecuent.traslate();
        return implicationPico;
    }
}